package pers.hl.lib_global.common

import com.amap.api.location.AMapLocationClient
import com.amap.api.location.AMapLocationClientOption
import com.amap.api.location.AMapLocationListener
import com.amap.api.maps2d.model.LatLng
import com.blankj.utilcode.util.LogUtils
import pers.hl.common.base.ext.showMessage
import pers.hl.lib_global.KTApplication


/**
 * 高德地图定位帮助类，基于定位sdk
 */
object AMapLocateHelper {

    //声明AMapLocationClient类对象
    var mLocationClient: AMapLocationClient? = null

    // 声明AMapLocationClientOption对象
    var mLocationOption: AMapLocationClientOption? = null

    /**
     * 获取定位
     */
    fun getLocation(onLocatedBlock: (LatLng) -> Unit) {
        //初始化定位
        if (mLocationClient == null) {
            mLocationClient =
                AMapLocationClient(KTApplication.getInstance())
        }
        //初始化AMapLocationClientOption对象
        if (mLocationOption == null) {
            mLocationOption = AMapLocationClientOption()
        }

        //设置定位回调监听
        mLocationClient?.apply {
            mLocationOption?.apply {
                // 设置定位场景，目前支持三种场景（签到、出行、运动，默认无场景）
                locationPurpose = AMapLocationClientOption.AMapLocationPurpose.Transport
                locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy
                isOnceLocation = true
                isOnceLocationLatest = true
                isNeedAddress = true
                // 默认采用连续定位模式，时间间隔2000ms
                interval = 5000L
            }
            //给定位客户端对象设置定位参数
            setLocationOption(mLocationOption)
            setLocationListener { location ->
                location?.apply {
                    if (errorCode == 0) {
                        LogUtils.d("定位成功，$this")
                        val latLng = LatLng(latitude, longitude)
                        onLocatedBlock(latLng)
                    } else {
                        //定位失败时，可通过ErrCode（错误码）信息来确定失败的原因，errInfo是错误信息，详见错误码表。
                        // https://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode
                        LogUtils.e("获取定位失败:${errorCode}")
                    }
                } ?: LogUtils.e("获取定位失败")
            }
            //设置场景模式后最好调用一次stop，再调用start以保证场景模式生效
            stopLocation()
            //启动定位
            startLocation()
        }
        // 设置定位模式
        // AMapLocationMode.Hight_Accuracy，高精度模式。
        // AMapLocationMode.Battery_Saving，低功耗模式。
        // AMapLocationMode.Device_Sensors，仅设备模式
        // 获取一次定位结果：该方法默认为false。
//        mLocationOption?.isOnceLocation = true
        //获取最近3s内精度最高的一次定位结果：
        //设置setOnceLocationLatest(boolean b)接口为true，启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true，setOnceLocation(boolean b)接口也会被设置为true，反之不会，默认为false。

        //设置定位间隔,单位毫秒,默认为2000ms，最低1000ms。
//        mLocationOption.setInterval(1000);
        //设置是否返回地址信息（默认返回地址信息）
        //单位是毫秒，默认30000毫秒，建议超时时间不要低于8000毫秒。
//        mLocationOption.setHttpTimeOut(20000);

    }

}